home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / dos6mm.zip / UMBFILES.ASM < prev    next >
Assembly Source File  |  1993-03-31  |  16KB  |  340 lines

  1. ;****************************************************************************
  2. ; UMBFILES extends the system file table (SFT) that DOS uses to track
  3. ; the state of open files by creating an extension of the SFT in upper
  4. ; memory. The syntax is
  5. ;
  6. ;       UMBFILES[=]nn
  7. ;
  8. ; where "nn" is the number of entries to be created in the SFT extension.
  9. ; For best results, boot your system with the statement FILES=8 in CONFIG.-
  10. ; SYS, and then allocate room for additional FILES with UMBFILES. For exam-
  11. ; ple, if you now boot with the statement FILES=40, change it to FILES=8 and
  12. ; add the statement UMBFILES=32 to your CONFIG.SYS file. The sum of FILES
  13. ; and UMBFILES may not exceed 255.
  14. ;
  15. ; NOTE: On some PCs, Windows will not start in 386 enhanced mode unless
  16. ; FILES is 10 or 12 or higher. If Windows refuses to start when UMBFILES
  17. ; is loaded, increase the FILES setting.
  18. ;****************************************************************************
  19.  
  20. code            segment
  21.                 assume  cs:code,ds:code
  22.                 org     100h
  23. begin:          jmp     main
  24.  
  25. copyright       db      "UMBFILES 1.3 Copyright (c) 1993 Jeff Prosise",13,10
  26.                 db      "From: PC Magazine DOS 6 Memory Management "
  27.                 db      "with Utilities",13,10,13,10
  28.                 db      "System file table extended",13,10
  29.                 db      "FILES is now equal to $"
  30.  
  31. helpmsg         db      "Builds an extension to the system file table (SFT) "
  32.                 db      "in upper memory.",13,10,13,10
  33.                 db      "UMBFILES[=]nn",13,10,13,10
  34.                 db      "  nn    Number of new SFT entries to create."
  35.                 db      13,10,13,10
  36.                 db      "UMBFILES requires DOS 5 or DOS 6 and a PC configured "
  37.                 db      "to load programs and",13,10
  38.                 db      "device drivers high. The sum of FILES and UMBFILES "
  39.                 db      "may not exceed 255.",13,10
  40. crlf            db      13,10,"$"
  41.  
  42. errmsg1         db      "Requires DOS 5 or DOS 6",13,10,"$"
  43. errmsg2         db      "Syntax: UMBFILES[=]nn",13,10,"$"
  44. errmsg3         db      "Invalid parameter or parameter out of range"
  45.                 db      13,10,"$"
  46. errmsg4         db      "FILES plus UMBFILES may not exceed 255",13,10,"$"
  47. errmsg5         db      "There is no upper memory available",13,10,"$"
  48. errmsg6         db      "Insufficient upper memory",13,10,"$"
  49.  
  50. umbfiles        dw      0                       ;Number of UMBFILES
  51. filecount       dw      0                       ;Resultant number of FILES
  52. strategy        dw      ?                       ;Memory allocation strategy
  53. linkstate       dw      0                       ;Upper memory link status
  54. lastblock       dd      ?                       ;Address of final SFT block
  55. sftlen          dw      ?                       ;Length of SFT extension
  56.  
  57. ;****************************************************************************
  58. ; Procedure MAIN
  59. ;****************************************************************************
  60.  
  61. main            proc    near
  62.                 cld                             ;Clear direction flag
  63.                 mov     si,81h                  ;Point SI to command line
  64.                 call    scanhelp                ;Scan for "/?" switch
  65.                 jnc     main1                   ;Branch if not found
  66.  
  67.                 mov     ah,09h                  ;Display help text and exit
  68.                 mov     dx,offset helpmsg       ;with ERRORLEVEL=0
  69.                 int     21h
  70.                 mov     ax,4C00h
  71.                 int     21h
  72. ;
  73. ; Check the DOS version and abort if it's not DOS 5 or DOS 6.
  74. ;
  75. main1:          mov     ah,30h                  ;Get DOS version
  76.                 int     21h
  77.                 mov     dx,offset errmsg1       ;Load error message address
  78.                 cmp     al,5                    ;Branch if the major version
  79.                 je      main2                   ;number is 5 or 6
  80.                 cmp     al,6
  81.                 je      main2
  82.  
  83. error:          mov     ah,09h                  ;Display error message
  84.                 int     21h
  85.                 mov     ax,4C01h                ;Exit with ERRORLEVEL=1
  86.                 int     21h
  87. ;
  88. ; Parse the command line to determine how many SFT entries to create.
  89. ;
  90. main2:          call    findchar                ;Advance to next character
  91.                 mov     dx,offset errmsg2       ;Error if EOL encountered
  92.                 jc      error
  93.  
  94.                 call    asc2bin                 ;Convert ASCII to binary
  95.                 mov     dx,offset errmsg3       ;Error if carry is set on
  96.                 jc      error                   ;return
  97.                 or      al,al                   ;Error if number was 0
  98.                 jz      error
  99.                 mov     byte ptr umbfiles,al    ;Save UMBFILES number
  100. ;
  101. ; Walk the chain of SFT headers to determine how many FILES already exist.
  102. ;
  103.                 xor     cx,cx                   ;Zero SFT entry count
  104.                 mov     ah,52h                  ;Get address of DOS's List
  105.                 int     21h                     ;of Lists
  106.                 les     bx,es:[bx+4]            ;Get SFT address in ES:BX
  107.  
  108. main3:          mov     word ptr lastblock,bx   ;Save the header address
  109.                 mov     word ptr lastblock[2],es
  110.                 add     cx,es:[bx+4]            ;Add entries in this block
  111.                 les     bx,es:[bx]              ;Get address of next block
  112.                 cmp     bx,0FFFFh               ;Loop if the offset address
  113.                 jne     main3                   ;is other than FFFFh
  114.  
  115.                 mov     dx,offset errmsg4       ;Verify that FILES plus
  116.                 add     cx,umbfiles             ;UMBFILES is less than
  117.                 cmp     cx,255                  ;or equal to 255 and
  118.                 ja      error                   ;abort if it's not
  119.                 mov     filecount,cx            ;Save new FILES count
  120. ;
  121. ; Allocate an upper memory block to hold the SFT extension.
  122. ;
  123.                 call    save_state              ;Save the current state
  124.  
  125.                 mov     ax,5803h                ;Set the UMB link
  126.                 mov     bx,1
  127.                 int     21h
  128.                 mov     dx,offset errmsg5       ;Error if carry set
  129.                 jc      error
  130.  
  131.                 mov     ax,5801h                ;Change to high-only, best-
  132.                 mov     bx,41h                  ;fit allocation strategy
  133.                 int     21h
  134.                 mov     dx,offset errmsg5       ;Error if carry set
  135.                 jc      error
  136.  
  137.                 mov     al,59                   ;Compute the number of
  138.                 mul     byte ptr umbfiles       ;paragraphs of memory
  139.                 mov     sftlen,ax               ;required for the SFT
  140.                 add     ax,21                   ;extension
  141.                 mov     cl,4
  142.                 shr     ax,cl
  143.                 mov     bx,ax
  144.                 mov     ah,48h                  ;Request the memory through
  145.                 int     21h                     ;DOS function 48h
  146.                 jnc     main4                   ;Branch if call succeeded
  147.  
  148.                 call    restore_state           ;Restore the memory state
  149.                 mov     dx,offset errmsg6       ;Load error message address
  150.                 jmp     error                   ;Jump to error handler
  151.  
  152. main4:          dec     ax                      ;Point ES to MCB preceding
  153.                 mov     es,ax                   ;the memory block
  154.                 mov     word ptr es:[01h],ax    ;Change owner ID to segment
  155.                 inc     word ptr es:[01h]       ;address of the UMB
  156.                 mov     si,offset copyright     ;Copy "UMBFILES" to the MCB
  157.                 mov     di,8                    ;so that DOS will know
  158.                 mov     cx,8                    ;who the owner is
  159.                 rep     movsb
  160.                 inc     ax                      ;Point ES back to the block
  161.                 mov     es,ax                   ;itself
  162.  
  163.                 call    restore_state           ;Restore the memory state
  164. ;
  165. ; Initialize the new SFT block and link it into the chain.
  166. ;
  167.                 mov     word ptr es:[00h],0FFFFh        ;Initialize the
  168.                 mov     word ptr es:[02h],0000h         ;SFT header
  169.                 mov     ax,umbfiles
  170.                 mov     word ptr es:[04h],ax
  171.  
  172.                 mov     cx,sftlen               ;Load CX with SFT length
  173.                 xor     al,al                   ;Fill the new SFT with
  174.                 mov     di,06h                  ;zeroes from start to
  175.                 rep     stosb                   ;finish
  176.  
  177.                 mov     ax,es                   ;Place the address of the
  178.                 les     di,lastblock            ;new SFT header in what
  179.                 mov     word ptr es:[di],00h    ;was formerly the final
  180.                 mov     word ptr es:[di+2],ax   ;SFT block
  181. ;
  182. ; Display message verifying that the operation is completed, and then exit.
  183. ;
  184.                 mov     ah,09h                  ;Display message
  185.                 mov     dx,offset copyright
  186.                 int     21h
  187.                 mov     ax,filecount            ;Display FILES count
  188.                 call    bin2asc
  189.                 mov     ah,09h                  ;Next line
  190.                 mov     dx,offset crlf
  191.                 int     21h
  192.                 mov     ax,4C00h                ;Exit with ERRORLEVEL=0
  193.                 int     21h
  194. main            endp
  195.  
  196. ;****************************************************************************
  197. ; SAVE_STATE saves the current memory allocation strategy and link state.
  198. ;****************************************************************************
  199.  
  200. save_state      proc    near
  201.                 mov     ax,5800h                ;Get the current memory
  202.                 int     21h                     ;allocation strategy
  203.                 mov     strategy,ax             ;code and save it
  204.                 mov     ax,5802h                ;Get the current link
  205.                 int     21h                     ;status and save it
  206.                 mov     byte ptr linkstate,al
  207.                 ret
  208. save_state      endp
  209.  
  210. ;****************************************************************************
  211. ; RESTORE_STATE restores the memory allocation strategy and link state
  212. ; saved earlier.
  213. ;****************************************************************************
  214.  
  215. restore_state   proc    near
  216.                 mov     ax,5801h                ;Restore original memory
  217.                 mov     bx,strategy             ;allocation strategy
  218.                 int     21h
  219.                 mov     ax,5803h                ;Restore original link
  220.                 mov     bx,linkstate            ;status
  221.                 int     21h
  222.                 ret
  223. restore_state   endp
  224.  
  225. ;****************************************************************************
  226. ; SCANHELP scans the command line for a /? switch. If found, carry returns
  227. ; set and SI contains its offset. If not found, carry returns clear.
  228. ;****************************************************************************
  229.  
  230. scanhelp        proc    near
  231.                 push    si                      ;Save SI
  232. scanloop:       lodsb                           ;Get a character
  233.                 cmp     al,0Dh                  ;Exit if end of line
  234.                 je      scan_exit
  235.                 cmp     al,"?"                  ;Loop if not "?"
  236.                 jne     scanloop
  237.                 cmp     byte ptr [si-2],"/"     ;Loop if not "/"
  238.                 jne     scanloop
  239.  
  240.                 add     sp,2                    ;Clear the stack
  241.                 sub     si,2                    ;Adjust SI
  242.                 stc                             ;Set carry and exit
  243.                 ret
  244.  
  245. scan_exit:      pop     si                      ;Restore SI
  246.                 clc                             ;Clear carry and exit
  247.                 ret
  248. scanhelp        endp
  249.  
  250. ;****************************************************************************
  251. ; FINDCHAR advances SI to the next non-white-space character. On return,
  252. ; carry set indicates EOL was encountered; carry clear indicates it was not.
  253. ;****************************************************************************
  254.  
  255. findchar        proc    near
  256.                 lodsb                           ;Get the next character
  257.                 cmp     al,09h                  ;Loop if tab
  258.                 je      findchar
  259.                 cmp     al,20h                  ;Loop if space
  260.                 je      findchar
  261.                 cmp     al,2Ch                  ;Loop if comma
  262.                 je      findchar
  263.                 cmp     al,3Dh                  ;Loop if equal sign
  264.                 je      findchar
  265.                 dec     si                      ;Point SI to the character
  266.                 cmp     al,0Dh                  ;Exit with carry set if end
  267.                 je      eol                     ;of line is reached
  268.  
  269.                 clc                             ;Clear carry and exit
  270.                 ret
  271.  
  272. eol:            stc                             ;Set carry and exit
  273.                 ret
  274. findchar        endp
  275.  
  276. ;****************************************************************************
  277. ; ASC2BIN converts a decimal number entered in ASCII form into a binary
  278. ; value in AL. Carry set on return indicates that an error occurred in
  279. ; the conversion.
  280. ;****************************************************************************
  281.  
  282. asc2bin         proc    near
  283.                 sub     ax,ax                   ;Initialize registers
  284.                 sub     bh,bh
  285.                 mov     dl,10
  286.  
  287. a2b_loop:       mov     bl,[si]                 ;Get a character
  288.                 inc     si
  289.                 cmp     bl,20h                  ;Exit if space
  290.                 je      a2b_exit
  291.                 cmp     bl,2Ch                  ;Exit if comma
  292.                 je      a2b_exit
  293.                 cmp     bl,0Dh                  ;Exit if carriage return
  294.                 je      a2b_exit
  295.  
  296.                 cmp     bl,"0"                  ;Error if character is not
  297.                 jb      a2b_error               ;a number
  298.                 cmp     bl,"9"
  299.                 ja      a2b_error
  300.  
  301.                 mul     dl                      ;Multiply the value in AL by
  302.                 jc      a2b_error               ;10 and exit on overflow
  303.                 sub     bl,30h                  ;ASCII => binary
  304.                 add     ax,bx                   ;Add latest value to AX
  305.                 cmp     ax,255                  ;Error if sum > 255
  306.                 jna     a2b_loop                ;Loop back for more
  307.  
  308. a2b_error:      dec     si                      ;Set carry and exit
  309.                 stc
  310.                 ret
  311.  
  312. a2b_exit:       dec     si                      ;Clear carry and exit
  313.                 clc
  314.                 ret
  315. asc2bin         endp
  316.  
  317. ;****************************************************************************
  318. ; BIN2ASC converts a binary value in AX to ASCII form and displays it.
  319. ;****************************************************************************
  320.  
  321. bin2asc         proc    near
  322.                 mov     bx,10                   ;Initialize divisor word and
  323.                 xor     cx,cx                   ;digit counter
  324. b2a1:           inc     cx                      ;Increment digit count
  325.                 xor     dx,dx                   ;Divide by 10
  326.                 div     bx
  327.                 push    dx                      ;Save remainder on stack
  328.                 or      ax,ax                   ;Loop until quotient is zero
  329.                 jnz     b2a1
  330. b2a2:           pop     dx                      ;Retrieve a digit from stack
  331.                 add     dl,30h                  ;Convert it to ASCII
  332.                 mov     ah,2                    ;Display it
  333.                 int     21h
  334.                 loop    b2a2                    ;Loop until done
  335.                 ret
  336. bin2asc         endp
  337.  
  338. code            ends
  339.                 end     begin
  340.